home *** CD-ROM | disk | FTP | other *** search
- /****** axuucp/ax-rmail ******************************************************
- *
- * NAME
- * ax-rmail - Sends AXsh mails
- *
- * SYNOPSIS
- * rx ax-rmail.rexx < [mbox]
- *
- * DESCRIPTION
- *
- * NOTES
- * Due to the problem that /bin/mailserver 1.15 is not able to parse
- * RFC 822 address fields correcly.
- * Also: if a mail message to and from an unroutable machine, the mail
- * message will get lost!
- *
- * AUTHOR
- * Tobias Ferber <tf@ganymed.hall.sub.org>
- *
- ******************************************************************************
- *
- */
-
- aka = axconfig('thismachine')
- tempfile = "T:ax-rmail." || pragma('Id')
- in = 'STDIN'
-
- /**/
-
- l = readln(in)
- fromaddr=''; toaddr=''; state = 'start'
-
- do while ~eof(in)
- select
-
- when state = 'start' then do
- if word(l,1)~='From' then do
- say 'From_ expected in line 1'
- exit 20
- end
- else do
- orig = l
- state = 'next'
- end
- end
-
- when state = 'next' then do
- call open('fp',tempfile,'Write')
- call writeln('fp',orig) /* From_ */
- select
- when upper(left(l,6)) = 'FROM: ' then do; fromaddr= rfcaddr(substr(l,7)); l= "From:" fromaddr; end
- when upper(left(l,4)) = 'TO: ' then do; toaddr= rfcaddr(substr(l,5)); l= "To:" toaddr; end
- when l='' then state='body null'
- otherwise nop
- end
- call writeln('fp',l)
- state = 'header'
- end
-
- when state = 'header' then do
- select
- when upper(left(l,6)) = 'FROM: ' then do; fromaddr= rfcaddr(substr(l,7)); l= "From:" fromaddr; end
- when upper(left(l,4)) = 'TO: ' then do; toaddr= rfcaddr(substr(l,5)); l= "To:" toaddr; end
- when l='' then state='body null'
- otherwise nop
- end
- call writeln('fp',l)
- end
-
- when state = 'body null' then do
- if word(l,1)='From' then do
- orig = l
- state = 'body from'
- end
- else do
- call writeln('fp',l)
- if l~='' then state = 'body nonnull'
- end
- end
-
- when state = 'body from' then do
- if right(word(l,1),1)=':' then do
- call close('fp')
- call mailRFC(tempfile,fromaddr,toaddr)
- address command 'delete quiet' tempfile
- fromaddr=''; toaddr=''
- state = 'have next'
- end
- else do
- call writeln('fp',orig)
- call writeln('fp',l)
- if l='' then state = 'body null'
- else state = 'body nonull'
- end
- end
-
- when state = 'body nonnull' then do
- call writeln('fp',l)
- if l='' then state = 'body null'
- end
-
- otherwise nop
- end
-
- if state = 'have next' then state = 'next'
- else l= readln(in)
- end
-
- if word(state,1) = 'body' then do
- call close('fp')
- call mailRFC(tempfile,fromaddr,toaddr)
- end
-
- if exists(tempfile) then address command 'Delete QUIET "'tempfile'"'
-
- exit
-
-
- mailRFC: procedure expose aka
- parse arg fname,fromaddr,toaddr
- if words(fromaddr) < 1 then do
- say 'ax-rmail: missing "From:" field (using "postmaster")'
- fromaddr= rfcaddr("postmaster")
- end
- if words(toaddr) < 1 then do
- say 'ax-rmail: missing "To:" field (using "postmaster")'
- to=rfcaddr("postmaster")
- end
- /*if upper(substr(toaddr,pos('@',toaddr)+1)) = upper(aka) then*/
- address command 'AXsh:bin/mailserver "'fname'"'
- /*else
- address command 'Execute UMS:s/MailRFC "'fname'" "'fromaddr'" "'toaddr'"'*/
- return
-
-
- /*@<rfcaddr><axconfig>*/
-
- /* expects an unfolded RFC 822 header line body, returns the address string or "" */
-
- RFCaddr: procedure expose aka
- parse arg str
- str= translate(str,' ',d2c(9))
- if pos('<',str) > 0 then do
- parse var str . "<" str ">"
- if pos(':',str) > 0 then parse var str . ':' str
- end
- else str= word(str,1)
- if pos('@',str) < 1 then str= str'@'aka
- return str
-
-
-
- /* get an AXsh configuration value */
-
- axconfig: procedure
- tempfile = "T:axconfig." || pragma('Id')
- rc_index = "AXsh:rexx/rc.index"
- var_val=""; var_file=""; var_defval="";
-
- parse upper arg var_name
- if left(var_name,1) ~= '%' then var_name = '%'var_name
- if right(var_name,1) ~= ':' then var_name = var_name':'
-
- if open('idx',rc_index,'Read') then do
- do until (eof('idx') | (var_file~=''))
- str= translate(readln('idx'),' ',d2c(9))
- if words(str) > 0 then do
- parse var str vname ' ' fname '"' defval '"'
- if upper(vname) = var_name then do
- var_file= strip(fname,'B',' 'd2c(9))
- var_defval= defval
- end
- end
- end
- call close('idx')
- end
- else say 'Could not read "'rc_index'"'
-
- if words(var_file) > 0 then do
- if open('rc',var_file,'Read') then do
- do until (eof('rc') | (var_val~=''))
- str= translate(readln('rc'),' ',d2c(9))
- if upper(word(str,1)) = var_name then var_val = strip(readln('rc'),'B',' 'd2c(9))
- end
- call close('rc')
- end
- else say 'Could not examine "'var_file'" for' var_name
- end
- else do
- if words(var_defval) > 0 then var_val= var_defval
- else say 'No such config variable:' var_name
- end
-
- return var_val
-
-